package bancosys.tec.security.impl.domain;

import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

import jmine.tec.persist.annotation.DiscriminatorComment;

import org.apache.commons.lang.builder.HashCodeBuilder;
import org.hibernate.annotations.Filter;
import org.hibernate.annotations.Filters;
import org.hibernate.util.EqualsHelper;

import bancosys.tec.component.Documentation;
import bancosys.tec.persist.authorization.annotation.DisplayName;
import bancosys.tec.security.authorization.Permission;
import bancosys.tec.security.authorization.UrlPermission;

/**
 * @author piercio
 */
@Entity
@DiscriminatorValue("1")
@DiscriminatorComment("URL")
@Filters({ @Filter(name = "authFilter", condition = "auth = :auth") })
@DisplayName("Credencial URL")
public class UrlCredential extends Credential {

    // numero impar qquer
    private static final int HASH_RANDOM_1 = 23;

    // numero impar diferente do primeiro qquer
    private static final int HASH_RANDOM_2 = 47;

    private String url;

    /**
     * Contrutor.
     */
    UrlCredential() {
        // não faz nada
    }

    /**
     * Contrutor.
     * 
     * @param url a url representada por essa credencial.
     */
    public UrlCredential(String url) {
        if (url == null) {
            throw new IllegalArgumentException("Url deve ser informado.");
        }
        this.url = url;
    }

    /**
     * Devolve a url representada por essa credencial.
     * 
     * @return a url representada por essa credencial.
     */
    @Column(name = "URL", length = 200)
    @Documentation("DESCRICAO DA URL QUE ATRIBUI PERMISSAO DE ACESSO VIA MENU NO SISTEMA.")
    public String getUrl() {
        return this.url;
    }

    /**
     * Define a url representada por essa credencial.
     * 
     * @param url a url representada por essa credencial.
     */
    public void setUrl(String url) {
        this.url = url;
    }

    /**
     * Compara esse objeto com o passado como parâmetro. Utiliza a url como critério de comparação.
     * 
     * @param obj o outro objeto.
     * @return <code>true</code> se forem iguais, <code>false</code> caso contrário.
     */
    @Override
    public boolean equals(Object obj) {
        if (!super.equals(obj)) {
            return false;
        }

        if (!(obj instanceof UrlCredential)) {
            return false;
        }
        UrlCredential other = (UrlCredential) obj;

        if (!EqualsHelper.equals(other.url, this.url)) {
            return false;
        }
        if (!EqualsHelper.equals(other.getClient(), this.getClient())) {
            return false;
        }
        return true;
    }

    /**
     * Devolve o hashCode.
     * 
     * @return o hashCode.
     */
    @Override
    public int hashCode() {
        int superHash = super.hashCode();
        HashCodeBuilder hashCodeBuilder = new HashCodeBuilder(HASH_RANDOM_1, HASH_RANDOM_2);
        hashCodeBuilder.appendSuper(superHash);
        hashCodeBuilder.append(this.getClient().getName());
        hashCodeBuilder.append(this.url);
        return hashCodeBuilder.toHashCode();
    }

    /**
     * Devolve a representação desse objeto.
     * 
     * @return a representação desse objeto.
     */
    @Override
    public String toString() {
        return "UrlCredential (" + this.url + ")";
    }

    /**
     * @return cria uma {@link UrlPermission}
     */
    @Override
    public Permission createPermission() {
        return new UrlPermission(this.getUrl());
    }

}
